<?php

Class Framework_Router
{
    /**
    * Путь до папки с контроллерами
    * 
    * @var string
    */
    private $_controllersPath;
    
    /**
    * Путь до пользовательского контроллера
    * 
    * @var string
    */
    private $_file;
    
    /**
    * Путь до шаблона вывода
    * 
    * @var string
    */
    private $_path;
    
    /**
    * Объект Controller_Request_Http
    * 
    * @var string
    */
    private $_request;
    
    /**
    * Пользовательский контроллер
    * 
    * @var string
    */
    private $_controller = 'IndexController';
    
    /**
    * Действие
    * 
    * @var string
    */
    private $_action = 'IndexAction';
    
    /**
    * Параметры из url
    * 
    * @var array
    */
    private $_args = array();
    
    private $_admin = null;

    /**
    * Конструктор
    * 
    * @return void
    */
    public function __construct(Framework_Controller_Request_Abstract $request)
    {
        $this->_request = $request;
        $base_uri = preg_replace('[http://[^/]+]si', '', $this->_request->getBaseUrl());
        $request_uri = parse_url(trim(preg_replace("[$base_uri]si", '', $request->getRequestUri()), '/\\'));
        $this->_path = isset($request_uri['path']) ? explode('/', $request_uri['path']) : array('');
    }

    public function setControllersPath($path)
    {
        $this->_controllerPath = $path;
    }

    public function route()
    {
        $admin = null;
        $slice = 2; // Насколько отрубаем массив
        if (!preg_match('[^[a-z]*$]si', $this->_path[0])) {
            throw new Framework_Controller_Exception("Название контроллера '{$this->_path[0]}' содержит недопустимые символы");
        } elseif ($this->_path[0] == 'admin') {
            $this->_admin = $this->_path[0] . '/';
            array_shift($this->_path);
            $slice = 2;
        }
        
        $controller = empty($this->_path[0]) ? 'index' : strtolower($this->_path[0]);
        $this->_request->setControllerName($controller);
        $action = empty($this->_path[1]) ? 'index' : strtolower($this->_path[1]);
        $this->_request->setActionName($action);
        
        $this->_controller = empty($this->_path[0]) ? 'IndexController' : ucfirst(strtolower($this->_path[0])) . 'Controller';
        $this->_action     = empty($this->_path[1]) ? 'indexAction'     : strtolower($this->_path[1]) . 'Action';
        $this->_file       = $this->_controllerPath . '/' . ucfirst($this->_admin) . $this->_controller . '.php';
        $this->_args       = array_slice($this->_path, $slice);

        Framework_Registry::set('args', $this->_args);
        
        if (is_readable($this->_file) == false) {
            throw new Framework_Controller_Exception("Файл недоступен для чтения либо его не существует '$this->_file'");
        }
    }
    
    public function getTemplatePath()
    {
        $folder = (empty($this->_path[0]))  ? 'index'    : strtolower($this->_path[0]);
        $file   = (empty($this->_path[1])) ? 'index.tpl' : strtolower($this->_path[1]) . '.tpl';

        return $this->_admin . $folder . '/' . $file;
    }
    
    public function getController()
    {
        return $this->_controller;
    }
    
    public function getAction()
    {
        return $this->_action;
    }
    
    public function getPath()
    {
        return $this->_file;
    }
}
